/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.compra.controlador;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import sv.com.intesal.clases.Mensaje;
import sv.com.intesal.clases.RutaProyecto;
import sv.com.intesal.clases.cVarios;
import sv.com.intesal.compra.bean.DevolucionCompra;
import sv.com.intesal.compra.sql.SQLDevolucionCompra;
import sv.com.intesal.conexion.cConexion;
import sv.com.intesal.seguridad.controlador.BitacoraControlador;
import sv.com.intesal.seguridad.controlador.SessionControlador;
import sv.com.intesal.seguridad.controlador.UsuarioControlador;

/**
 *
 * @author ejerez
 */
public class DevolucionCompraControlador {

    public void setEnca(DevolucionCompra dc, List<DevolucionCompra> lista) throws Exception {
        Connection cnn = null;
        PreparedStatement ps = null;
        try {
            cnn = cConexion.conectar();

            if (dc.getCodigo_dc() == null) {
                SessionControlador sc = new SessionControlador();

                ps = cnn.prepareStatement(SQLDevolucionCompra.insertEncaDevolucionCompra);
                ps.setInt(1, dc.getCompra().getId_c());
                ps.setInt(2, sc.getCodigo_Usuario());
                ps.setDate(3, cVarios.getFecha(dc.getFecha_dc()));
                ps.setString(4, "AC");
                ps.setString(5, dc.getNumero_factura_dc());
                ps.setString(6, "MP");
                ps.setString(7, dc.getDescripcion_dc());
            } else {
                //MODIFICAR
                ps = cnn.prepareStatement(SQLDevolucionCompra.updateEncaDevolucionCompra);
                ps.setInt(1, dc.getId_c());
                ps.setDate(2, cVarios.getFecha(dc.getFecha_dc()));
                ps.setString(3, dc.getNumero_factura_dc());
                ps.setString(4, dc.getTipo_dc());
                ps.setString(5, dc.getDescripcion_dc());
                ps.setInt(6, dc.getCodigo_dc());
            }
            ps.executeUpdate();
            this.setDeta(dc, lista);

            Mensaje m = new Mensaje();
            if (dc.getCodigo_dc() == null) {
                m.messageInfo(m.getIinformation());
            } else {
                m.messageInfo(m.getImodificada());
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private void setDeta(DevolucionCompra dc, List<DevolucionCompra> lista) throws Exception {
        try {
            Integer codigo_dc = dc.getCodigo_dc();
            if (codigo_dc == null) {
                codigo_dc = this.getMax();
            }

            MaterialControlador mc = new MaterialControlador();
            BitacoraControlador bc = new BitacoraControlador();

            for (int i = 0; i < lista.size(); i++) {
                if (lista.get(i).getId_d() == 0) {

                    PreparedStatement ps = null;
                    Connection cnn = null;
                    cnn = cConexion.conectar();
                    ps = cnn.prepareStatement(SQLDevolucionCompra.insertDetaDevolucionCompra);

                    ps.setInt(1, codigo_dc);
                    ps.setInt(2, lista.get(i).getCompra().getId_dm());
                    ps.setInt(3, lista.get(i).getCompra().getId_d());
                    ps.setDouble(4, lista.get(i).getCantidad_d());
                    ps.setDouble(5, lista.get(i).getCosto_d());
                    ps.setDouble(6, lista.get(i).getIva_d());
                    ps.setDouble(7, lista.get(i).getExento_d());
                    ps.setDouble(8, lista.get(i).getMonto_d());

                    ps.executeUpdate();

                    ps.close();
                    mc.setCantidadMaterial_Aumentar_Disminuir(codigo_dc, lista.get(i).getId_dm(), lista.get(i).getCompra().getCantidad_d(), "D", bc.ingresarDevolucionCompra + ": " + lista.get(0).getNumero_factura_dc(), lista.get(0).getNumero_factura_dc(), bc.ingresarDevolucionCompra);
                }
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private Integer getMax() throws Exception {

        try {
            ResultSet rs = cConexion.conectar().prepareStatement(SQLDevolucionCompra.getMax).executeQuery();
            rs.next();
            return rs.getInt("max");
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private void setCambiarEstado(String estado, Integer codigo_dc) throws Exception {

        PreparedStatement ps = null;
        Connection cnn = null;
        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLDevolucionCompra.setEstado);
            ps.setString(1, estado);
            ps.setInt(2, codigo_dc);
            ps.executeUpdate();
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void anularDevolucionCompra(List<DevolucionCompra> lista) throws Exception {
        try {
            MaterialControlador mc = new MaterialControlador();
            BitacoraControlador bc = new BitacoraControlador();

            for (int i = 0; i < lista.size(); i++) {
                mc.setCantidadMaterial_Aumentar_Disminuir(lista.get(i).getCodigo_dc(), lista.get(i).getId_dm(), lista.get(i).getCantidad_d(), "A", bc.anulacionDevolucionCompra + ": " + lista.get(0).getNumero_factura_dc(), lista.get(0).getNumero_factura_dc(), bc.anulacionDevolucionCompra);
            }
            bc.setBitacoraAnulacion(lista.get(0).getCodigo_dc(), bc.anulacionDevolucionCompra + ": " + lista.get(0).getNumero_factura_dc(), bc.anulacionDevolucionCompra);
            this.setCambiarEstado("A", lista.get(0).getCodigo_dc());

            Mensaje m = new Mensaje();
            m.messageInfo(m.getIanulada());
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void modificarDevolucionCompra(DevolucionCompra dc) throws Exception {
        try {
            SessionControlador sc = new SessionControlador();
            sc.setCodigo_Proceso_DC(dc.getCodigo_dc());
            sc.redireccionar("/SICOPI" + RutaProyecto.wfrmDevolucionCompra);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void setEliminarItem(DevolucionCompra dc) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLDevolucionCompra.eliminarItemDevolucionCompra);
            ps.setInt(1, dc.getId_d());
            ps.executeUpdate();

            MaterialControlador mc = new MaterialControlador();
            BitacoraControlador bc = new BitacoraControlador();

            mc.setCantidadMaterial_Aumentar_Disminuir(dc.getCodigo_dc(), dc.getId_dm(), dc.getCantidad_d(), "A", bc.eliminarItemDevolucionCompra + ": " + dc.getNumero_factura_dc(), dc.getNumero_factura_dc(), bc.eliminarItemDevolucionCompra);
            bc.setBitacoraAnulacion(dc.getCodigo_dc(), bc.eliminarItemDevolucionCompra + ": " + dc.getNumero_factura_dc(), bc.eliminarItemDevolucionCompra);

            Mensaje m = new Mensaje();
            m.messageInfo(m.getIeliminada());
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<DevolucionCompra> getDevolucionCompras_x_Compra(Integer codigo_compra) throws Exception {
        List<DevolucionCompra> lista = new ArrayList<DevolucionCompra>();
        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLDevolucionCompra.getDevolucionCompras_x_Compra);
            ps.setInt(1, codigo_compra);
            ResultSet rs = ps.executeQuery();

            UsuarioControlador uc = new UsuarioControlador();
            while (rs.next()) {
                DevolucionCompra dc = new DevolucionCompra();

                /*ENCA_dc_COMPRA*/
                dc.setCodigo_dc(rs.getInt("codigo_dc"));
                dc.setFecha_dc(rs.getDate("fecha_dc"));
                dc.setFechahora(rs.getTimestamp("fechahora"));
                dc.setEstado_dc(rs.getString("estado_dc"));
                dc.setNumero_factura_dc(rs.getString("numero_factura_dc"));
                dc.setTipo_dc(rs.getString("tipo_dc"));
                dc.setDescripcion_dc(rs.getString("descripcion_dc"));

                /*DETA_dc_COMPRA*/
                dc.setId_d(rs.getInt("id_d"));
                dc.setCodigo_id_d(rs.getInt("codigo_id_d"));
                dc.setCantidad_d(rs.getDouble("cantidad_d"));
                dc.setCosto_d(rs.getDouble("costo_d"));
                dc.setExento_d(rs.getDouble("costo_d"));
                dc.setIva_d(rs.getDouble("costo_d"));
                dc.setMonto_d(rs.getDouble("costo_d"));


                /*MATERIAL*/
                dc.setNombre_m(rs.getString("nombre_m"));

                /*MATERIAL_SUCURSAL*/
                dc.setId_dm(rs.getInt("id_dm"));

                dc.setUsuario_u(rs.getString("usuario_u"));/*USUARIO*/
                lista.add(dc);
            }

            ps.close();
            rs.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Boolean validarCompraDetalle_con_DevolucionCompra(Integer codigo_detalle_compra) throws Exception {

        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLDevolucionCompra.validarCodigo_id_c);
            ps.setInt(1, codigo_detalle_compra);
            ResultSet rs = ps.executeQuery();
            rs.next();

            if (rs.getInt("contar") == 0) {
                return true;/*SI NO HAY REGISTRO EN LA BASE DE DATOS ENTONCES EL DETALLE DE LA COMPRA ES VALIDA PARA INGRESARLO COMO UNA NOTA DE CREDITO (DEVOLUCION COMPRA)*/
            }
            return false;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Boolean validarCantidad_x_Compra_en_DevolucionCompra(DevolucionCompra dc) throws Exception {

        try {

            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLDevolucionCompra.validarCantidad_x_Compra_en_DevolucionCompra);

            ps.setInt(1, dc.getCompra().getId_c());
            ps.setInt(2, dc.getId_dm());
            ps.setInt(3, dc.getCompra().getId_d());
            System.out.println(ps.toString());
            ResultSet rs = ps.executeQuery();

            Double cantidad = 0.00;
            while (rs.next()) {
                cantidad = rs.getDouble("cantidad");
            }
            cantidad += dc.getCantidad_d();

            CompraControlador cc = new CompraControlador();
            if (cc.getCantidad_x_Correlativo(dc.getCompra().getId_d()) < cantidad) {
                return false;
            }
            return true;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public DevolucionCompra getDevolucionCompra(Integer codigo_dc) throws Exception {
        try {

            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLDevolucionCompra.getDevolucionCompraEnca);
            ps.setInt(1, codigo_dc);
            ResultSet rs = ps.executeQuery();

            DevolucionCompra dc = new DevolucionCompra();
            UsuarioControlador uc = new UsuarioControlador();
            while (rs.next()) {
                dc.setCodigo_dc(rs.getInt("codigo_dc"));
                dc.setId_c(rs.getInt("id_c"));
                dc.setFecha_dc(rs.getDate("fecha_dc"));
                dc.setFechahora(rs.getTimestamp("fechahora"));
                dc.setTipo_dc(rs.getString("tipo_dc"));
                dc.setDescripcion_dc(rs.getString("descripcion_dc"));
                dc.setNumero_factura_dc(rs.getString("numero_factura_dc"));
                dc.setEstado_dc(rs.getString("estado_dc"));

            }

            ps.close();
            rs.close();
            return dc;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<DevolucionCompra> getDetaDevolucionCompra(Integer codigo_dc) throws Exception {
        try {
            List<DevolucionCompra> lista = new ArrayList<DevolucionCompra>();
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLDevolucionCompra.getDevolucionCompraDeta);
            ps.setInt(1, codigo_dc);
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                DevolucionCompra dc = new DevolucionCompra();

                /*MATERIAL*/
                dc.setId_dm(rs.getInt("id_dm"));
                dc.setNombre_m(rs.getString("nombre_m"));

                /*DETA_DEVOLUCION_COMPRA*/
                dc.setId_d(rs.getInt("id_d"));
                dc.setCodigo_id_d(rs.getInt("codigo_id_d"));
                dc.setMonto_d(rs.getDouble("monto_d"));
                dc.setCosto_d(rs.getDouble("costo_d"));
                dc.setIva_d(rs.getDouble("iva_d"));
                dc.setExento_d(rs.getDouble("exento_d"));
                dc.setCantidad_d(rs.getDouble("cantidad_d"));
                lista.add(dc);
            }

            ps.close();
            rs.close();
            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<DevolucionCompra> getConsultaEncaDevolucionCompra(DevolucionCompra DC) throws Exception {
        List<DevolucionCompra> lista = new ArrayList<DevolucionCompra>();
        try {
            String var_estado = " and dc.estado_dc='AC' ";
            String var_fechas = this.getFiltro_Fechas(DC);
            String var_proveedor = this.getFiltro_Proveedor(DC);

            if (DC.getFiltro_estado_dc() == true) {
                var_estado = " "; //trae todos los estados.
            }
            String sql = "select dc.*,p.empresa_p,em.nombre_em,u.usuario_u from devolucion_compra as dc,enca_compra as c,orden_compra as oc,proveedor as p,empresa as em ,USUARIO as u where c.id_c=dc.id_c and oc.id_oc=c.id_oc and p.id_p=oc.id_p and em.id_em=oc.id_em and u.id_u=dc.id_u"
                    + var_estado + var_fechas + var_proveedor
                    + " order by dc.fecha_dc,dc.numero_factura_dc ";

            ResultSet rs = cConexion.conectar().prepareStatement(sql).executeQuery();
            while (rs.next()) {
                DevolucionCompra dc = new DevolucionCompra();

                dc.setCodigo_dc(rs.getInt("codigo_dc"));
                dc.setNumero_factura_dc(rs.getString("numero_factura_dc"));
                dc.setFecha_dc(rs.getDate("fecha_dc"));
                dc.setFechahora(rs.getTimestamp("fechahora"));
                dc.setEstado_dc(rs.getString("estado_dc"));
                dc.setDescripcion_dc(rs.getString("descripcion_dc"));
                dc.setTipo_dc(rs.getString("tipo_dc"));

                dc.setNombre_em(rs.getString("nombre_em"));
                dc.setEmpresa_p(rs.getString("empresa_p"));
                dc.setUsuario_u(rs.getString("usuario_u"));
                lista.add(dc);
            }
            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<DevolucionCompra> getConsultaDetaDevolucionCompra(Integer codigo_dc) throws Exception {

        List<DevolucionCompra> lista = new ArrayList<DevolucionCompra>();
        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLDevolucionCompra.getConsultaDetaDevolucionCompraDeta);
            ps.setInt(1, codigo_dc);
            rs = ps.executeQuery();


            cVarios v = new cVarios();
            while (rs.next()) {
                DevolucionCompra dc = new DevolucionCompra();

                /*DEVOLUCION_COMPRA*/
                dc.setCodigo_dc(rs.getInt("codigo_dc"));
                dc.setNumero_factura_dc(rs.getString("numero_factura_dc"));

                /*MATERIAL*/
                dc.setId_dm(rs.getInt("id_dm"));
                dc.setNombre_m(rs.getString("nombre_m"));

                /*DETA_DEVOLUCION_COMPRA*/
                dc.setId_d(rs.getInt("id_d"));
                dc.setCodigo_id_d(rs.getInt("codigo_id_d"));
                dc.setMonto_d(rs.getDouble("monto_d"));
                dc.setCosto_d(rs.getDouble("costo_d"));
                dc.setIva_d(rs.getDouble("iva_d"));
                dc.setExento_d(rs.getDouble("exento_d"));
                dc.setCantidad_d(rs.getDouble("cantidad_d"));
                lista.add(dc);
            }
            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private String getFiltro_Fechas(DevolucionCompra co) throws Exception {
        try {
            String var_fechas = " ";
            if (co.getFecha_i() != null && co.getFecha_f() == null) {
                var_fechas = " and dc.fecha_dc >='" + cVarios.getFecha(co.getFecha_i()) + "' ";
            } else if (co.getFecha_f() != null && co.getFecha_i() == null) {
                var_fechas = " and dc.fecha_dc <='" + cVarios.getFecha(co.getFecha_f()) + "' ";
            } else if (co.getFecha_i() == null && co.getFecha_f() == null) {
                var_fechas = " ";
            } else {
                var_fechas = " and dc.fecha_dc between '" + cVarios.getFecha(co.getFecha_i()) + "' and '" + cVarios.getFecha(co.getFecha_f()) + "' ";
            }
            return var_fechas;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private String getFiltro_Proveedor(DevolucionCompra co) {
        try {
            String var_proveedor = " and p.id_p=" + co.getId_p() + " ";

            if (co.getId_p() == null) {
                var_proveedor = " ";//trae todos los proveedores.
            }
            return var_proveedor;
        } catch (Exception e) {
            return " ";
        }
    }

    /*REPORTES*/
    public void getEncaReporte_DevolucionCompra(DevolucionCompra dc) throws Exception {
        try {
        } catch (Exception e) {
        }
    }

    public void getDetaReporte_DevolucionCompra(Integer codigo_dc) throws Exception {
        try {
        } catch (Exception e) {
            throw new Exception(e);
        }
    }
}
